public class Convolve {

	/**
	 * @param args
	 */
	
	// 2 tableaux pour voir si on obtient la même chose
	static float[] kernel1d = null;
	static float[][] kernel2d = null;

	public static void CreerNoyau(int rayon, float sigma) {
		
		//provisoire: c'était pour voir si la conversion en tableau à une dimension marchait bien
		kernel2d = new float[2*rayon+1][2*rayon+1];
		
		//une matrice de (2r+1)*(2r+1) aura (4r²+4r+1) valeurs
		kernel1d = new float[4*rayon*rayon+4*rayon+1];
		
		
		if (sigma != 0 && rayon >= 1) {

			float gaussianKernelFactor = 0;
			float e = 0;
			
			//intérateur pour le tableau à 1d
			int i = 0;

			for (int ky = -rayon; ky <= rayon; ky++) {
				for (int kx = -rayon; kx <= rayon; kx++) {
					e = (float) Math.exp(-(kx * kx + ky * ky)
							/ (2 * sigma * sigma));
					
					gaussianKernelFactor += e;

					kernel2d[kx + rayon][ky + rayon] = e;

					kernel1d[i++] = e;
				}
			}

			System.out.println(" gaussianKernelFactor = "+gaussianKernelFactor);
			System.out.println(" 2d");
			//affichage de kernel2d
			for (int ky = -rayon; ky <= rayon; ky++) {
				for (int kx = -rayon; kx <= rayon; kx++) {
					kernel2d[kx + rayon][ky + rayon] = kernel2d[kx + rayon][ky + rayon]/gaussianKernelFactor;
					System.out.print("\t "+kernel2d[kx + rayon][ky + rayon]);
				}
				System.out.println("");
			}
			
			System.out.println("\n\n 1d");
			
			//affichage de kernel1d
			for (int j=0; j<kernel1d.length;j++){
				
				kernel1d[j] = kernel1d[j]/gaussianKernelFactor;
				if (j % (2*rayon+1) == 0){
					System.out.println("");
				}
				System.out.print("\t "+kernel1d[j] );
			}
						
		} else {
			// erreur: mais elle sera surement évitée dans le contrôleur avant
			// d'appeler la méthode.
		}

	}
	
	
	public Convolve(int r,float s){
		super();
		CreerNoyau(r ,s);
	}
	
	public float[] get1d(){
		return kernel1d;
	}
	
	public static void main(String[] args) {
		
		CreerNoyau(2 ,(float)1.4);
	}

}
